[INFO] fetching crate anki-llm 2.0.18...
[INFO] testing anki-llm-2.0.18 against master#cced03bfd61a304243a34504618ecec86c17063f for pr-154065-2
[INFO] extracting crate anki-llm 2.0.18 into /workspace/builds/worker-0-tc1/source
[INFO] started tweaking crates.io crate anki-llm 2.0.18
[INFO] removed 0 missing tests
[INFO] finished tweaking crates.io crate anki-llm 2.0.18
[INFO] tweaked toml for crates.io crate anki-llm 2.0.18 written to /workspace/builds/worker-0-tc1/source/Cargo.toml
[INFO] validating manifest of crates.io crate anki-llm 2.0.18 on toolchain cced03bfd61a304243a34504618ecec86c17063f
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate anki-llm 2.0.18 already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded serial_test v3.4.0
[INFO] [stderr]   Downloaded scc v2.4.0
[INFO] [stderr]   Downloaded serial_test_derive v3.4.0
[INFO] [stderr]   Downloaded line-clipping v0.3.7
[INFO] [stderr]   Downloaded sdd v3.0.10
[INFO] [stderr]   Downloaded lru v0.16.4
[INFO] [stderr]   Downloaded kasuari v0.4.12
[INFO] [stderr]   Downloaded tungstenite v0.29.0
[INFO] [stderr]   Downloaded pulldown-cmark-escape v0.11.0
[INFO] [stderr]   Downloaded euclid v0.22.14
[INFO] [stderr]   Downloaded jsonrepair v0.1.0
[INFO] [stderr]   Downloaded pulldown-cmark v0.13.3
[INFO] [stderr]   Downloaded assert_cmd v2.2.1
[INFO] [stderr]   Downloaded fax v0.2.7
[INFO] [stderr]   Downloaded ammonia v4.1.2
[INFO] [stderr]   Downloaded string_cache_codegen v0.5.4
[INFO] [stderr]   Downloaded cssparser v0.35.0
[INFO] [stderr]   Downloaded match_token v0.35.0
[INFO] [stderr]   Downloaded web_atoms v0.1.3
[INFO] [stderr]   Downloaded html5ever v0.35.0
[INFO] [stderr]   Downloaded markup5ever v0.35.0
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] b29a1ed09b689c49dbbec1d9ef0c162423d73d7234645e8f836445c87ded8953
[INFO] running `Command { std: "docker" "start" "-a" "b29a1ed09b689c49dbbec1d9ef0c162423d73d7234645e8f836445c87ded8953", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "b29a1ed09b689c49dbbec1d9ef0c162423d73d7234645e8f836445c87ded8953", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "b29a1ed09b689c49dbbec1d9ef0c162423d73d7234645e8f836445c87ded8953", kill_on_drop: false }`
[INFO] [stdout] b29a1ed09b689c49dbbec1d9ef0c162423d73d7234645e8f836445c87ded8953
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] acb54bfa12675daf36e50cd779be2874e0b6b6f2790ed0653648e0132ccf817f
[INFO] running `Command { std: "docker" "start" "-a" "acb54bfa12675daf36e50cd779be2874e0b6b6f2790ed0653648e0132ccf817f", kill_on_drop: false }`
[INFO] [stderr]    Compiling bitflags v2.11.1
[INFO] [stderr]    Compiling siphasher v1.0.2
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]    Compiling rand_core v0.6.4
[INFO] [stderr]    Compiling unicode-segmentation v1.13.2
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling rustversion v1.0.22
[INFO] [stderr]    Compiling linux-raw-sys v0.12.1
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling cc v1.2.61
[INFO] [stderr]    Compiling displaydoc v0.2.5
[INFO] [stderr]    Compiling thiserror-impl v2.0.18
[INFO] [stderr]    Compiling darling_core v0.23.0
[INFO] [stderr]    Compiling zerofrom v0.1.7
[INFO] [stderr]    Compiling hashbrown v0.16.1
[INFO] [stderr]    Compiling signal-hook v0.3.18
[INFO] [stderr]    Compiling phf_shared v0.11.3
[INFO] [stderr]    Compiling rand v0.8.6
[INFO] [stderr]    Compiling yoke v0.8.2
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling simd-adler32 v0.3.9
[INFO] [stderr]    Compiling itertools v0.14.0
[INFO] [stderr]    Compiling zerovec v0.11.6
[INFO] [stderr]    Compiling convert_case v0.10.0
[INFO] [stderr]    Compiling zerotrie v0.2.4
[INFO] [stderr]    Compiling strum_macros v0.27.2
[INFO] [stderr]    Compiling instability v0.3.12
[INFO] [stderr]    Compiling phf_generator v0.11.3
[INFO] [stderr]    Compiling indoc v2.0.7
[INFO] [stderr]    Compiling phf_macros v0.11.3
[INFO] [stderr]    Compiling string_cache_codegen v0.5.4
[INFO] [stderr]    Compiling tinystr v0.8.3
[INFO] [stderr]    Compiling potential_utf v0.1.5
[INFO] [stderr]    Compiling phf_codegen v0.11.3
[INFO] [stderr]    Compiling icu_collections v2.2.0
[INFO] [stderr]    Compiling castaway v0.2.4
[INFO] [stderr]    Compiling derive_more-impl v2.1.1
[INFO] [stderr]    Compiling compact_str v0.9.0
[INFO] [stderr]    Compiling miniz_oxide v0.8.9
[INFO] [stderr]    Compiling lru v0.16.4
[INFO] [stderr]    Compiling phf v0.11.3
[INFO] [stderr]    Compiling thiserror v2.0.18
[INFO] [stderr]    Compiling icu_locale_core v2.2.0
[INFO] [stderr]    Compiling kasuari v0.4.12
[INFO] [stderr]    Compiling getrandom v0.2.17
[INFO] [stderr]    Compiling mio v1.2.0
[INFO] [stderr]    Compiling getrandom v0.3.4
[INFO] [stderr]    Compiling web_atoms v0.1.3
[INFO] [stderr]    Compiling hybrid-array v0.4.11
[INFO] [stderr]    Compiling num_threads v0.1.7
[INFO] [stderr]    Compiling ring v0.17.14
[INFO] [stderr]    Compiling flate2 v1.1.9
[INFO] [stderr]    Compiling derive_more v2.1.1
[INFO] [stderr]    Compiling unicode-truncate v2.0.1
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]    Compiling num-conv v0.2.1
[INFO] [stderr]    Compiling signal-hook-mio v0.2.5
[INFO] [stderr]    Compiling rand_core v0.10.1
[INFO] [stderr]    Compiling time v0.3.47
[INFO] [stderr]    Compiling http v1.4.0
[INFO] [stderr]    Compiling rand_core v0.9.5
[INFO] [stderr]    Compiling crypto-common v0.1.7
[INFO] [stderr]    Compiling fdeflate v0.3.7
[INFO] [stderr]    Compiling line-clipping v0.3.7
[INFO] [stderr]    Compiling pxfm v0.1.29
[INFO] [stderr]    Compiling portable-atomic v1.13.1
[INFO] [stderr]    Compiling digest v0.10.7
[INFO] [stderr]    Compiling png v0.18.1
[INFO] [stderr]    Compiling crypto-common v0.2.1
[INFO] [stderr]    Compiling icu_provider v2.2.0
[INFO] [stderr]    Compiling block-buffer v0.12.0
[INFO] [stderr]    Compiling rand_chacha v0.9.0
[INFO] [stderr]    Compiling match_token v0.35.0
[INFO] [stderr]    Compiling cssparser-macros v0.6.1
[INFO] [stderr]    Compiling aho-corasick v1.1.4
[INFO] [stderr]    Compiling jsonrepair v0.1.0
[INFO] [stderr]    Compiling const-oid v0.10.2
[INFO] [stderr]    Compiling icu_normalizer v2.2.0
[INFO] [stderr]    Compiling icu_properties v2.2.0
[INFO] [stderr]    Compiling pulldown-cmark v0.13.3
[INFO] [stderr]    Compiling bytemuck v1.25.0
[INFO] [stderr]    Compiling strum v0.27.2
[INFO] [stderr]    Compiling x11rb-protocol v0.13.2
[INFO] [stderr]    Compiling cssparser v0.35.0
[INFO] [stderr]    Compiling ratatui-core v0.1.0
[INFO] [stderr]    Compiling rand v0.9.4
[INFO] [stderr]    Compiling ureq-proto v0.6.0
[INFO] [stderr]    Compiling sha1 v0.10.6
[INFO] [stderr]    Compiling darling_macro v0.23.0
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling idna_adapter v1.2.2
[INFO] [stderr]    Compiling darling v0.23.0
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]    Compiling idna v1.1.0
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling indexmap v2.14.0
[INFO] [stderr]    Compiling digest v0.11.3
[INFO] [stderr]    Compiling clap_builder v4.6.0
[INFO] [stderr]    Compiling fuzzy-matcher v0.3.7
[INFO] [stderr]    Compiling url v2.5.8
[INFO] [stderr]    Compiling string_cache v0.8.9
[INFO] [stderr]    Compiling chacha20 v0.10.0
[INFO] [stderr]    Compiling crossterm v0.29.0
[INFO] [stderr]    Compiling ratatui-widgets v0.3.0
[INFO] [stderr]    Compiling rustls v0.23.40
[INFO] [stderr]    Compiling gethostname v1.1.0
[INFO] [stderr]    Compiling clap_derive v4.6.1
[INFO] [stderr]    Compiling csv-core v0.1.13
[INFO] [stderr]    Compiling moxcms v0.8.1
[INFO] [stderr]    Compiling console v0.16.3
[INFO] [stderr]    Compiling markup5ever v0.35.0
[INFO] [stderr]    Compiling html5ever v0.35.0
[INFO] [stderr]    Compiling data-encoding v2.11.0
[INFO] [stderr]    Compiling ratatui-crossterm v0.1.0
[INFO] [stderr]    Compiling unsafe-libyaml v0.2.11
[INFO] [stderr]    Compiling unit-prefix v0.5.2
[INFO] [stderr]    Compiling maplit v1.0.2
[INFO] [stderr]    Compiling dyn-clone v1.0.20
[INFO] [stderr]    Compiling utf8-zero v0.8.1
[INFO] [stderr]    Compiling pulldown-cmark-escape v0.11.0
[INFO] [stderr]    Compiling inquire v0.9.4
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling indicatif v0.18.4
[INFO] [stderr]    Compiling csv v1.4.0
[INFO] [stderr]    Compiling ratatui-macros v0.7.0
[INFO] [stderr]    Compiling ratatui v0.30.0
[INFO] [stderr]    Compiling regex v1.12.3
[INFO] [stderr]    Compiling serde_yaml v0.9.34+deprecated
[INFO] [stderr]    Compiling ammonia v4.1.2
[INFO] [stderr]    Compiling rustls-webpki v0.103.13
[INFO] [stderr]    Compiling rand v0.10.1
[INFO] [stderr]    Compiling x11rb v0.13.2
[INFO] [stderr]    Compiling clap v4.6.1
[INFO] [stderr]    Compiling sha2 v0.11.0
[INFO] [stderr]    Compiling image v0.25.10
[INFO] [stderr]    Compiling tungstenite v0.29.0
[INFO] [stderr]    Compiling ureq v3.3.0
[INFO] [stderr]    Compiling arboard v3.6.1
[INFO] [stderr]    Compiling anki-llm v2.0.18 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 28s
[INFO] running `Command { std: "docker" "inspect" "acb54bfa12675daf36e50cd779be2874e0b6b6f2790ed0653648e0132ccf817f", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "acb54bfa12675daf36e50cd779be2874e0b6b6f2790ed0653648e0132ccf817f", kill_on_drop: false }`
[INFO] [stdout] acb54bfa12675daf36e50cd779be2874e0b6b6f2790ed0653648e0132ccf817f
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] aadba9a6a367aa8585f918418eaa1f567922701217670687be7ccd6214f9ee44
[INFO] running `Command { std: "docker" "start" "-a" "aadba9a6a367aa8585f918418eaa1f567922701217670687be7ccd6214f9ee44", kill_on_drop: false }`
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling predicates-core v1.0.10
[INFO] [stderr]    Compiling futures-core v0.3.32
[INFO] [stderr]    Compiling float-cmp v0.10.0
[INFO] [stderr]    Compiling normalize-line-endings v0.3.0
[INFO] [stderr]    Compiling difflib v0.4.0
[INFO] [stderr]    Compiling termtree v0.5.1
[INFO] [stderr]    Compiling sdd v3.0.10
[INFO] [stderr]    Compiling assert_cmd v2.2.1
[INFO] [stderr]    Compiling serial_test_derive v3.4.0
[INFO] [stderr]    Compiling wait-timeout v0.2.1
[INFO] [stderr]    Compiling futures-util v0.3.32
[INFO] [stderr]    Compiling predicates-tree v1.0.13
[INFO] [stderr]    Compiling scc v2.4.0
[INFO] [stderr]    Compiling futures-executor v0.3.32
[INFO] [stderr]    Compiling serial_test v3.4.0
[INFO] [stderr]    Compiling regex v1.12.3
[INFO] [stderr]    Compiling bstr v1.12.1
[INFO] [stderr]    Compiling predicates v3.1.4
[INFO] [stderr]    Compiling anki-llm v2.0.18 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 32.62s
[INFO] running `Command { std: "docker" "inspect" "aadba9a6a367aa8585f918418eaa1f567922701217670687be7ccd6214f9ee44", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "aadba9a6a367aa8585f918418eaa1f567922701217670687be7ccd6214f9ee44", kill_on_drop: false }`
[INFO] [stdout] aadba9a6a367aa8585f918418eaa1f567922701217670687be7ccd6214f9ee44
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+cced03bfd61a304243a34504618ecec86c17063f" "test" "--frozen", kill_on_drop: false }`
[INFO] [stdout] d925b52445db0a4c1ed95db079b1912d790b330417ecbdc296e44d30b4c4161a
[INFO] running `Command { std: "docker" "start" "-a" "d925b52445db0a4c1ed95db079b1912d790b330417ecbdc296e44d30b4c4161a", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.56s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/anki_llm-7a656d1d2db5373b)
[INFO] [stdout] 
[INFO] [stdout] running 426 tests
[INFO] [stdout] test anki::client::tests::anki_quote_simple ... ok
[INFO] [stdout] test audio::player::tests::binary_exists_handles_missing_path_var ... ok
[INFO] [stdout] test batch::controller::tests::_suppress_unused_warnings ... ok
[INFO] [stdout] test audio::player::tests::detect_player_is_optional ... ok
[INFO] [stdout] test batch::deck_mode::tests::build_update_action_basic ... ok
[INFO] [stdout] test anki::client::tests::anki_quote_with_backslash ... ok
[INFO] [stdout] test batch::deck_mode::tests::build_update_action_skips_internal_fields ... ok
[INFO] [stdout] test batch::engine::tests::abort_callback_stops_processing ... ok
[INFO] [stdout] test batch::deck_mode::tests::build_update_action_allows_real_id_field ... ok
[INFO] [stdout] test batch::engine::tests::fatal_error_skips_retries ... ok
[INFO] [stdout] test batch::engine::tests::all_rows_succeed ... ok
[INFO] [stdout] test batch::engine::tests::failure_row_has_error_field ... ok
[INFO] [stdout] test batch::engine::tests::cancel_stops_processing ... ok
[INFO] [stdout] test batch::engine::tests::on_row_done_callback_is_called ... ok
[INFO] [stdout] test batch::controller::tests::empty_input_still_finalizes ... ok
[INFO] [stdout] test batch::engine::tests::all_rows_fail ... ok
[INFO] [stdout] test batch::error::tests::processing_is_retryable ... ok
[INFO] [stdout] test batch::file_mode::tests::rows_without_id_are_skipped ... ok
[INFO] [stdout] test batch::controller::tests::plain_path_terminates_and_calls_finalization ... ok
[INFO] [stdout] test anki::client::tests::anki_quote_with_double_quotes ... ok
[INFO] [stdout] test batch::file_mode::tests::flush_writes_rows_in_input_order ... ok
[INFO] [stdout] test batch::file_mode::tests::flush_threshold_triggers_write ... ok
[INFO] [stdout] test batch::file_mode::tests::failure_rows_are_stored ... ok
[INFO] [stdout] test batch::engine::tests::no_usage_means_zero_tokens ... ok
[INFO] [stdout] test batch::report::tests::usage_stats_add_and_total ... ok
[INFO] [stdout] test config::store::tests::get_set_keys ... ok
[INFO] [stdout] test data::csv_io::tests::empty_input_returns_empty_vec ... ok
[INFO] [stdout] test data::csv_io::tests::serialize_empty_returns_empty_string ... ok
[INFO] [stdout] test data::csv_io::tests::serialize_quotes_all_fields ... ok
[INFO] [stdout] test data::csv_io::tests::parse_simple_csv ... ok
[INFO] [stdout] test data::io::tests::file_format_no_extension ... ok
[INFO] [stdout] test data::io::tests::file_format_csv ... ok
[INFO] [stdout] test data::io::tests::file_format_unsupported ... ok
[INFO] [stdout] test data::io::tests::file_format_yaml ... ok
[INFO] [stdout] test data::io::tests::file_format_yml ... ok
[INFO] [stdout] test data::csv_io::tests::round_trip ... ok
[INFO] [stdout] test data::io::tests::load_existing_output_nonexistent ... ok
[INFO] [stdout] test audio::player::tests::spawn_failure_surfaces_player_event ... ok
[INFO] [stdout] test data::rows::tests::note_id_fallback_to_id ... ok
[INFO] [stdout] test data::rows::tests::note_id_from_number ... ok
[INFO] [stdout] test data::rows::tests::note_id_from_string ... ok
[INFO] [stdout] test data::rows::tests::note_id_missing ... ok
[INFO] [stdout] test data::rows::tests::require_note_id_error_lists_fields ... ok
[INFO] [stdout] test data::slug::tests::all_special_chars_fallback ... ok
[INFO] [stdout] test data::io::tests::file_format_uppercase ... ok
[INFO] [stdout] test data::slug::tests::simple_name ... ok
[INFO] [stdout] test data::slug::tests::already_clean ... ok
[INFO] [stdout] test data::slug::tests::special_chars ... ok
[INFO] [stdout] test data::yaml_io::tests::numeric_values_preserved ... ok
[INFO] [stdout] test data::slug::tests::sub_deck ... ok
[INFO] [stdout] test data::yaml_io::tests::parse_non_array_returns_error ... ok
[INFO] [stdout] test data::yaml_io::tests::parse_simple_yaml ... ok
[INFO] [stdout] test data::yaml_io::tests::round_trip_preserves_order_and_values ... ok
[INFO] [stdout] test doctor::report::tests::mask_long ... ok
[INFO] [stdout] test doctor::report::tests::mask_short ... ok
[INFO] [stdout] test data::io::tests::atomic_write_and_read_back ... ok
[INFO] [stdout] test batch::file_mode::tests::existing_rows_are_preserved ... ok
[INFO] [stdout] test data::io::tests::load_existing_output_corrupt_file_errors ... ok
[INFO] [stdout] test data::io::tests::load_existing_output_builds_map ... ok
[INFO] [stdout] test batch::error::tests::fatal_is_not_retryable ... ok
[INFO] [stdout] test config::store::tests::read_missing_file_returns_defaults ... ok
[INFO] [stdout] test generate::cards::tests::escape_special_chars ... ok
[INFO] [stdout] test config::store::tests::state_round_trip ... ok
[INFO] [stdout] test generate::anki_import::tests::finalize_skips_when_target_field_already_populated ... ok
[INFO] [stdout] test config::store::tests::backward_compat_with_old_json ... ok
[INFO] [stdout] test config::store::tests::write_and_read_round_trip ... ok
[INFO] [stdout] test generate::cards::tests::ignores_search_candidate_without_exact_first_field_match ... ok
[INFO] [stdout] test generate::init::prompt::tests::generate_generic_prompt_body_test ... ok
[INFO] [stdout] test generate::init::util::tests::resolve_duplicate_keys_no_collision_with_preexisting_numbered ... ok
[INFO] [stdout] test generate::init::util::tests::resolve_duplicate_keys_no_duplicates ... ok
[INFO] [stdout] test generate::init::util::tests::resolve_duplicate_keys_with_duplicates ... ok
[INFO] [stdout] test generate::anki_import::tests::finalize_aborts_on_mid_run_upload_failure_with_partial_state ... ok
[INFO] [stdout] test generate::init::util::tests::suggest_key_common_fields ... ok
[INFO] [stdout] test generate::anki_import::tests::finalize_stale_after_edit_resynthesizes ... ok
[INFO] [stdout] test generate::process::tests::build_check_schema ... ok
[INFO] [stdout] test generate::init::util::tests::suggest_key_unknown_fields ... ok
[INFO] [stdout] test generate::process::tests::build_transform_schema ... ok
[INFO] [stdout] test generate::init::util::tests::is_auto_generated_field_sound ... ok
[INFO] [stdout] test generate::anki_import::tests::finalize_happy_path_uploads_all_cards_and_rewrites_target_fields ... ok
[INFO] [stdout] test generate::anki_import::tests::finalize_deduplicates_uploads_for_identical_cards ... ok
[INFO] [stdout] test generate::anki_import::tests::finalize_cache_hit_when_already_previewed ... ok
[INFO] [stdout] test generate::init::util::tests::is_auto_generated_field_image ... ok
[INFO] [stdout] test generate::cards::tests::uses_exact_first_field_match_when_search_returns_multiple_candidates ... ok
[INFO] [stdout] test generate::cards::tests::map_fields ... ok
[INFO] [stdout] test generate::process::tests::emit_diff_multiline ... ok
[INFO] [stdout] test generate::process::tests::emit_diff_single_line ... ok
[INFO] [stdout] test generate::process::tests::parse_check_pass ... ok
[INFO] [stdout] test generate::process::tests::parse_check_reject ... ok
[INFO] [stdout] test generate::process::tests::parse_check_flag ... ok
[INFO] [stdout] test generate::process::tests::parse_check_invalid_json_errors ... ok
[INFO] [stdout] test generate::process::tests::parse_transform_missing_field_errors ... ok
[INFO] [stdout] test generate::process::tests::parse_transform_multi_writes ... ok
[INFO] [stdout] test generate::process::tests::parse_transform_single_target ... ok
[INFO] [stdout] test generate::sanitize::tests::array_to_list ... ok
[INFO] [stdout] test generate::sanitize::tests::sanitize_strips_script ... ok
[INFO] [stdout] test generate::sanitize::tests::sanitize_markdown_bold ... ok
[INFO] [stdout] test generate::sanitize::tests::sanitize_fields_mixed ... ok
[INFO] [stdout] test generate::tui::tests::any_synthesizing_guard_fires_even_when_focus_moves ... ok
[INFO] [stdout] test generate::tui::tests::done_quit_preserves_natural_exit_semantics ... ok
[INFO] [stdout] test generate::process::tests::emit_diff_empty_old ... ok
[INFO] [stdout] test generate::tui::tests::done_play_returns_play_audio_effect_for_cached_audio ... ok
[INFO] [stdout] test generate::tui::tests::pending_cancel_discards_backend_events_until_completion ... ok
[INFO] [stdout] test generate::tui::tests::preview_queue_full_rollback_clears_optimistic_tts_state ... ok
[INFO] [stdout] test generate::tui::tests::request_selection_batch_continuation_returns_worker_effect ... ok
[INFO] [stdout] test generate::tui::tests::done_play_without_cached_audio_sets_toast_and_returns_no_effect ... ok
[INFO] [stdout] test generate::tui::tests::running_escape_returns_cancel_effect_after_state_reset ... ok
[INFO] [stdout] test generate::tui::tests::done_delete_returns_delete_effect_without_mutating_cards ... ok
[INFO] [stdout] test generate::tui::tests::delete_result_success_clears_done_cards_and_notes ... ok
[INFO] [stdout] test generate::tui::tests::done_copy_returns_copy_cards_effect ... ok
[INFO] [stdout] test generate::tui::tests::selection_confirm_and_cancel_block_while_any_tts_synthesizes ... ok
[INFO] [stdout] test generate::tui::tests::app_new_initial_term_is_pure_state_setup ... ok
[INFO] [stdout] test generate::tui::tests::append_cards_batch_continuation_returns_worker_effect ... ok
[INFO] [stdout] test generate::tui::tests::input_enter_returns_start_effect_for_single_term ... ok
[INFO] [stdout] test generate::tui::tests::delete_result_failure_preserves_done_cards_and_notes ... ok
[INFO] [stdout] test generate::tui::tests::selection_model_picker_defers_model_change ... ok
[INFO] [stdout] test generate::tui::tests::selection_refresh_applies_deferred_model_as_effects ... ok
[INFO] [stdout] test generate::tui::tests::send_initial_start_emits_start_for_initial_term_only ... ok
[INFO] [stdout] test generate::tui::tests::stale_tts_state_returns_no_effect_and_stores_no_state ... ok
[INFO] [stdout] test generate::tui::tests::tts_ready_returns_play_audio_effect_for_existing_card ... ok
[INFO] [stdout] test generate::tui::tests::session_ready_returns_audio_player_start_effect ... ok
[INFO] [stdout] test generate::tui::tests::thinking_buffer_is_bounded ... ok
[INFO] [stdout] test generate::tui::tests::thinking_delta_is_ephemeral ... ok
[INFO] [stdout] test llm::client::request::tests::reasoning_content_stream_request_has_no_extra_body ... ok
[INFO] [stdout] test generate::tui::tests::thinking_persists_on_reset_but_clears_on_done_error_and_cancel_discard ... ok
[INFO] [stdout] test llm::client::request::tests::structured_request_omits_optional_fields_when_absent ... ok
[INFO] [stdout] test generate::cards::tests::build_validated_card_populates_duplicate_fields_and_model ... ok
[INFO] [stdout] test llm::client::response::tests::effective_usage_includes_reasoning_token_details ... ok
[INFO] [stdout] test llm::client::response::tests::effective_usage_includes_hidden_total_tokens ... ok
[INFO] [stdout] test llm::client::streaming::reader::tests::stream_ending_before_done_is_error ... ok
[INFO] [stdout] test llm::client::request::tests::gemini_thinking_stream_request_serializes_extra_body ... ok
[INFO] [stdout] test llm::client::request::tests::structured_request_serializes_system_user_and_schema ... ok
[INFO] [stdout] test llm::client::streaming::reducer::tests::stream_reducer_normalizes_streamed_usage ... ok
[INFO] [stdout] test llm::client::streaming::tag_splitter::tests::flushes_pending_thinking_segment ... ok
[INFO] [stdout] test llm::client::tests::gemini_thinking_config_gates_gemini_only ... ok
[INFO] [stdout] test llm::client::tests::gemini_thinking_enabled_allows_gemini_streaming ... ok
[INFO] [stdout] test llm::extract::tests::errors_when_required_and_missing ... ok
[INFO] [stdout] test llm::extract::tests::extracts_content ... ok
[INFO] [stdout] test llm::extract::tests::returns_raw_when_not_required ... ok
[INFO] [stdout] test llm::client::streaming::reader::tests::stream_without_sse_events_hits_idle_timeout ... ok
[INFO] [stdout] test llm::client::streaming::reader::tests::streamed_reasoning_content_counts_as_activity ... ok
[INFO] [stdout] test llm::client::streaming::reducer::tests::tag_splitter_preserves_literal_full_thought_tag_inside_json ... ok
[INFO] [stdout] test llm::client::streaming::reader::tests::threaded_reader_reads_valid_stream ... ok
[INFO] [stdout] test llm::client::streaming::reducer::tests::tag_splitter_preserves_literal_tag_text_outside_tags ... ok
[INFO] [stdout] test llm::client::streaming::tag_splitter::tests::buffers_split_tag_until_complete ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_fenced_block ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_fenced_block_no_newlines ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_json_array_from_fenced ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_json_array_non_array_returns_none ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_array_returns_none ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_plain_text_returns_none ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_json_array ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_json_array_non_objects_returns_none ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_raw_object ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_single_object_from_fenced_singleton_array ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_single_object_from_singleton_array ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_single_object_rejects_multi_element_array ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_single_object_rejects_non_object_array_item ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_empty_string_returns_none ... ok
[INFO] [stdout] test llm::parse_json::tests::parse_single_object_top_level ... ok
[INFO] [stdout] test llm::parse_json::tests::repair_fenced_block_with_trailing_comma ... ok
[INFO] [stdout] test llm::parse_json::tests::repair_trailing_comma_object ... ok
[INFO] [stdout] test llm::parse_json::tests::repair_truncated_object ... ok
[INFO] [stdout] test llm::pricing::tests::all_supported_models_have_pricing ... ok
[INFO] [stdout] test llm::pricing::tests::calculate_cost_known_model ... ok
[INFO] [stdout] test llm::pricing::tests::calculate_cost_unknown_model ... ok
[INFO] [stdout] test llm::parse_json::tests::repair_unquoted_keys ... ok
[INFO] [stdout] test llm::pricing::tests::format_cost_small ... ok
[INFO] [stdout] test llm::pricing::tests::format_cost_zero ... ok
[INFO] [stdout] test llm::provider::tests::deepseek_model_uses_deepseek ... ok
[INFO] [stdout] test llm::provider::tests::gemini_model_uses_gemini ... ok
[INFO] [stdout] test llm::provider::tests::gpt_model_uses_openai ... ok
[INFO] [stdout] test llm::provider::tests::grok_model_uses_xai ... ok
[INFO] [stdout] test llm::provider::tests::omit_temperature_gpt5 ... ok
[INFO] [stdout] test llm::provider::tests::preserve_temperature_non_gpt5 ... ok
[INFO] [stdout] test llm::provider::tests::thinking_capability_requires_known_provider_url ... ok
[INFO] [stdout] test llm::provider::tests::unknown_prefix_defaults_to_openai ... ok
[INFO] [stdout] test llm::retry::tests::fatal_error_stops_immediately ... ok
[INFO] [stdout] test llm::retry::tests::succeeds_on_first_try ... ok
[INFO] [stdout] test llm::runtime::tests::accepts_unknown_model_with_custom_endpoint ... ok
[INFO] [stdout] test llm::runtime::tests::accepts_temperature_boundary_values ... ok
[INFO] [stdout] test llm::runtime::tests::default_batch_size ... ok
[INFO] [stdout] test llm::runtime::tests::cli_api_key_takes_precedence ... ok
[INFO] [stdout] test llm::runtime::tests::dry_run_skips_api_key ... ok
[INFO] [stdout] test llm::runtime::tests::custom_endpoint_does_not_require_api_key ... ok
[INFO] [stdout] test llm::runtime::tests::gemini_thinking_defaults_to_enabled ... ok
[INFO] [stdout] test llm::runtime::tests::gemini_thinking_reads_config ... ok
[INFO] [stdout] test llm::runtime::tests::gpt5_omits_temperature ... ok
[INFO] [stdout] test llm::runtime::tests::non_gpt5_preserves_temperature ... ok
[INFO] [stdout] test llm::runtime::tests::rejects_temperature_out_of_range ... ok
[INFO] [stdout] test llm::sse::tests::flush_emits_trailing_event ... ok
[INFO] [stdout] test llm::sse::tests::parses_crlf_frame ... ok
[INFO] [stdout] test llm::sse::tests::ignores_comments_and_joins_data_lines ... ok
[INFO] [stdout] test llm::sse::tests::parses_split_lf_frame ... ok
[INFO] [stdout] test note_type::files::tests::discover_only_returns_dirs_with_manifest ... ok
[INFO] [stdout] test note_type::paths::tests::slugify_collapses_runs ... ok
[INFO] [stdout] test note_type::paths::tests::slugify_empty_becomes_underscore ... ok
[INFO] [stdout] test note_type::paths::tests::slugify_preserves_safe_chars ... ok
[INFO] [stdout] test note_type::paths::tests::slugify_replaces_unsafe ... ok
[INFO] [stdout] test note_type::paths::tests::slugify_trims_edges ... ok
[INFO] [stdout] test note_type::files::tests::round_trip_with_unsafe_names ... ok
[INFO] [stdout] test note_type::files::tests::write_removes_stale_template_files ... ok
[INFO] [stdout] test snapshot::store::tests::legacy_snapshot_with_string_deck_loads ... ok
[INFO] [stdout] test snapshot::store::tests::query_mode_snapshot_source_display ... ok
[INFO] [stdout] test snapshot::store::tests::days_to_ymd_known_date ... ok
[INFO] [stdout] test snapshot::store::tests::save_and_load_snapshot ... ok
[INFO] [stdout] test snapshot::store::tests::snapshot_round_trip ... ok
[INFO] [stdout] test template::fill::tests::ambiguous_keys ... ok
[INFO] [stdout] test note_type::files::tests::missing_back_html_fails ... ok
[INFO] [stdout] test template::fill::tests::case_insensitive ... ok
[INFO] [stdout] test template::fill::tests::basic_fill ... ok
[INFO] [stdout] test template::fill::tests::missing_placeholder ... ok
[INFO] [stdout] test template::fill::tests::multiple_same_placeholder ... ok
[INFO] [stdout] test snapshot::store::tests::run_id_is_sortable ... ok
[INFO] [stdout] test template::fill::tests::no_placeholders ... ok
[INFO] [stdout] test template::fill::tests::number_value ... ok
[INFO] [stdout] test template::fill::tests::null_value ... ok
[INFO] [stdout] test template::fill::tests::unicode_field_name ... ok
[INFO] [stdout] test template::frontmatter::tests::legacy_post_process_rejected ... ok
[INFO] [stdout] test template::frontmatter::tests::empty_field_map ... ok
[INFO] [stdout] test generate::tui::tests::batch_run_error_returns_start_effect_for_next_term ... ok
[INFO] [stdout] test generate::tui::tests::edited_yaml_first_field_lookup_is_order_independent ... ok
[INFO] [stdout] test generate::tui::tests::review_completion_returns_review_effect ... ok
[INFO] [stdout] test llm::client::streaming::reducer::tests::stream_reducer_separates_reasoning_content ... ok
[INFO] [stdout] test llm::client::streaming::reducer::tests::tag_splitter_handles_split_gemini_thoughts ... ok
[INFO] [stdout] test template::frontmatter::tests::missing_frontmatter_markers ... ok
[INFO] [stdout] test template::frontmatter::tests::parse_tts_block_with_field_source ... ok
[INFO] [stdout] test template::frontmatter::tests::processing_transform_requires_target_or_writes ... ok
[INFO] [stdout] test llm::extract::tests::trims_whitespace ... ok
[INFO] [stdout] test template::frontmatter::tests::parse_processing_config ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_azure_rejects_model ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_azure_rejects_speed ... ok
[INFO] [stdout] test template::frontmatter::tests::processing_check_rejects_target ... ok
[INFO] [stdout] test template::frontmatter::tests::parse_tts_block_with_template_source ... ok
[INFO] [stdout] test template::frontmatter::tests::legacy_quality_check_rejected ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_azure_requires_region ... ok
[INFO] [stdout] test template::frontmatter::tests::parse_valid_frontmatter ... ok
[INFO] [stdout] test template::frontmatter::tests::processing_field_must_be_in_field_map ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_edge_rejects_model ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_source_field_must_be_in_field_map ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_azure_with_region_parses ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_source_neither_rejected ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_edge_rejects_region ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_openai_rejects_region ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_edge_with_speed_parses_without_region ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_source_both_field_and_template_rejected ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_speed_must_be_positive ... ok
[INFO] [stdout] test template::process_prompt::tests::parses_minimal_prompt ... ok
[INFO] [stdout] test template::process_prompt::tests::rejects_empty_body ... ok
[INFO] [stdout] test template::process_prompt::tests::rejects_empty_field ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_template_placeholder_must_be_in_field_map ... ok
[INFO] [stdout] test template::process_prompt::tests::rejects_missing_output ... ok
[INFO] [stdout] test snapshot::store::tests::days_to_ymd_epoch ... ok
[INFO] [stdout] test template::process_prompt::tests::rejects_unknown_fields ... ok
[INFO] [stdout] test template::process_prompt::tests::rejects_missing_frontmatter ... ok
[INFO] [stdout] test tts::cache::tests::different_endpoint_different_key ... ok
[INFO] [stdout] test tts::cache::tests::different_provider_different_key ... ok
[INFO] [stdout] test tts::cache::tests::different_payload_different_key ... ok
[INFO] [stdout] test tts::cache::tests::different_voice_different_key ... ok
[INFO] [stdout] test tts::cache::tests::filename_has_format_extension ... ok
[INFO] [stdout] test template::process_prompt::tests::rejects_unknown_output_fields ... ok
[INFO] [stdout] test tts::cache::tests::different_text_format_different_key ... ok
[INFO] [stdout] test template::process_prompt::tests::parses_full_prompt ... ok
[INFO] [stdout] test tts::ir::tests::canonical_distinguishes_pron_from_text ... ok
[INFO] [stdout] test tts::ir::tests::canonical_distinguishes_different_readings ... ok
[INFO] [stdout] test tts::cache::tests::store_and_load_roundtrip ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_without_voice_rejected ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_absent_is_fine ... ok
[INFO] [stdout] test tts::ir::tests::canonical_is_stable_across_equivalent_inputs ... ok
[INFO] [stdout] test tts::ir::tests::deck_prompt_correct_example ... ok
[INFO] [stdout] test tts::ir::tests::deck_prompt_incorrect_style_handled_natively ... ok
[INFO] [stdout] test tts::ir::tests::compat_ideograph_in_cluster ... ok
[INFO] [stdout] test tts::ir::tests::empty_input ... ok
[INFO] [stdout] test tts::ir::tests::empty_reading_rejected ... ok
[INFO] [stdout] test tts::ir::tests::first_sample_exact_spans ... ok
[INFO] [stdout] test tts::ir::tests::honorific_prefix_is_text ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_unknown_provider_rejected ... ok
[INFO] [stdout] test tts::ir::tests::iteration_mark_inside_cluster ... ok
[INFO] [stdout] test tts::ir::tests::katakana_reading ... ok
[INFO] [stdout] test tts::ir::tests::katakana_surface_with_reading ... ok
[INFO] [stdout] test tts::ir::tests::long_vowel_mark_in_reading ... ok
[INFO] [stdout] test template::frontmatter::tests::tts_without_target_rejected ... ok
[INFO] [stdout] test tts::ir::tests::mid_word_annotation_is_han_cluster_only ... ok
[INFO] [stdout] test tts::ir::tests::legacy_hypertts_spaced_input ... ok
[INFO] [stdout] test tts::ir::tests::non_kana_reading_rejected ... ok
[INFO] [stdout] test tts::ir::tests::orphan_annotation_after_kana_rejected ... ok
[INFO] [stdout] test tts::ir::tests::real_deck_samples_parse_successfully ... ok
[INFO] [stdout] test tts::ir::tests::plain_text_no_annotations ... ok
[INFO] [stdout] test tts::ir::tests::simple_single_annotation ... ok
[INFO] [stdout] test tts::ir::tests::small_ke_inside_cluster ... ok
[INFO] [stdout] test tts::ir::tests::unclosed_bracket_is_error ... ok
[INFO] [stdout] test tts::ir::tests::small_ka_inside_cluster ... ok
[INFO] [stdout] test tts::media::tests::format_sound_tag_wraps ... ok
[INFO] [stdout] test tts::process_row::tests::legacy_mode_passes_row_through ... ok
[INFO] [stdout] test tts::process_row::tests::prompt_mode_handles_missing_anki_field_gracefully ... ok
[INFO] [stdout] test tts::cache::tests::zero_byte_file_is_miss ... ok
[INFO] [stdout] test tts::ir::tests::orphan_annotation_rejected ... ok
[INFO] [stdout] test tts::cache::tests::same_request_same_key ... ok
[INFO] [stdout] test tts::provider::amazon::tests::error_mapping_status_codes ... ok
[INFO] [stdout] test tts::provider::amazon::tests::hmac_sha256_known_vector ... ok
[INFO] [stdout] test tts::provider::amazon::tests::format_amz_dates_leap_day ... ok
[INFO] [stdout] test tts::process_row::tests::prompt_mode_projects_field_map_keys_only ... ok
[INFO] [stdout] test tts::provider::azure::tests::endpoint_for_region ... ok
[INFO] [stdout] test tts::provider::amazon::tests::signing_key_derivation_matches_aws_reference ... ok
[INFO] [stdout] test tts::process_row::tests::prompt_mode_template_expansion_no_ambiguity_collision ... ok
[INFO] [stdout] test tts::provider::amazon::tests::format_amz_dates_known_values ... ok
[INFO] [stdout] test tts::provider::amazon::tests::format_amz_dates_epoch ... ok
[INFO] [stdout] test tts::provider::amazon::tests::sigv4_matches_aws_reference ... ok
[INFO] [stdout] test tts::provider::amazon::tests::sigv4_with_session_token_signs_that_header ... ok
[INFO] [stdout] test tts::provider::amazon::tests::id_and_text_format ... ok
[INFO] [stdout] test tts::provider::azure::tests::endpoint_identity_omits_path ... ok
[INFO] [stdout] test tts::provider::amazon::tests::host_and_endpoint_formatting ... ok
[INFO] [stdout] test tts::provider::azure::tests::error_mapping_status_codes ... ok
[INFO] [stdout] test tts::provider::azure::tests::id_and_text_format ... ok
[INFO] [stdout] test tts::provider::edge::tests::binary_audio_body_extracts_matching_audio ... ok
[INFO] [stdout] test tts::provider::edge::tests::binary_audio_body_ignores_non_audio_frames ... ok
[INFO] [stdout] test tts::provider::edge::tests::binary_audio_body_rejects_short_frames ... ok
[INFO] [stdout] test tts::provider::edge::tests::connect_request_contains_current_edge_auth_query_and_headers ... ok
[INFO] [stdout] test tts::provider::google::tests::derives_language_code_from_voice ... ok
[INFO] [stdout] test tts::provider::google::tests::endpoint_identity_is_global ... ok
[INFO] [stdout] test tts::provider::edge::tests::id_profile_and_endpoint_identity ... ok
[INFO] [stdout] test tts::provider::edge::tests::text_headers_require_separator ... ok
[INFO] [stdout] test tts::provider::google::tests::error_mapping_status_codes ... ok
[INFO] [stdout] test tts::provider::google::tests::rejects_voice_without_enough_segments ... ok
[INFO] [stdout] test tts::provider::google::tests::id_and_text_format ... ok
[INFO] [stdout] test tts::provider::edge::tests::request_messages_match_edge_contract ... ok
[INFO] [stdout] test tts::render::tests::edge_rate_mapping_is_deterministic ... ok
[INFO] [stdout] test tts::render::tests::edge_ssml_escapes_text_and_attributes ... ok
[INFO] [stdout] test tts::render::tests::edge_ssml_uses_plain_readings_inside_prosody ... ok
[INFO] [stdout] test tts::render::tests::ssml_empty_body ... ok
[INFO] [stdout] test tts::render::tests::ssml_mid_word_split_sample ... ok
[INFO] [stdout] test tts::render::tests::plain_text_empty ... ok
[INFO] [stdout] test tts::render::tests::plain_text_handles_mid_word_split ... ok
[INFO] [stdout] test tts::render::tests::ssml_single_pronunciation ... ok
[INFO] [stdout] test tts::render::tests::ssml_xml_escapes_surface_and_reading_attrs ... ok
[INFO] [stdout] test tts::render::tests::ssml_xml_escapes_text_span ... ok
[INFO] [stdout] test tts::render::tests::ssml_xml_escapes_voice_attribute ... ok
[INFO] [stdout] test tts::runtime::tests::edge_resolves_without_credentials_and_preserves_speed ... ok
[INFO] [stdout] test tts::service::tests::build_bundle_resolves_edge_without_credentials ... ok
[INFO] [stdout] test tts::service::tests::ensure_cached_hits_cache_on_second_call ... ok
[INFO] [stdout] test tts::service::tests::eval_row_projection_omits_unmapped_keys ... ok
[INFO] [stdout] test tts::service::tests::prepare_from_row_edge_ssml_flow ... ok
[INFO] [stdout] test tts::service::tests::prepare_from_row_ssml_flow ... ok
[INFO] [stdout] test tts::service::tests::prepare_errors_on_empty_normalized_text ... ok
[INFO] [stdout] test tts::service::tests::prepare_from_row_plain_text_flow ... ok
[INFO] [stdout] test tts::service::tests::render_payload_dispatches_edge_ssml ... ok
[INFO] [stdout] test tts::service::tests::session_tts_new_does_not_resolve_credentials ... ok
[INFO] [stdout] test tts::spec::tests::azure_missing_key_errors ... ok
[INFO] [stdout] test tts::service::tests::session_tts_bundle_errors_on_bad_spec_and_retries ... ok
[INFO] [stdout] test tts::spec::tests::azure_resolves_with_cli_flags ... ok
[INFO] [stdout] test tts::service::tests::prepare_is_deterministic ... ok
[INFO] [stdout] test tts::spec::tests::openai_without_key_errors ... ok
[INFO] [stdout] test tts::spec::tests::edge_resolves_without_credentials_and_preserves_speed ... ok
[INFO] [stdout] test tts::service::tests::session_tts_bundle_caches_successful_build ... ok
[INFO] [stdout] test tts::spec::tests::template_source_becomes_inline ... ok
[INFO] [stdout] test tts::spec::tests::unknown_format_errors ... ok
[INFO] [stdout] test tts::template::tests::field_source_missing_is_empty ... ok
[INFO] [stdout] test tts::spec::tests::yaml_provider_overrides_default ... ok
[INFO] [stdout] test tts::template::tests::field_source_reads_value ... ok
[INFO] [stdout] test tts::template::tests::file_source_fills_placeholders ... ok
[INFO] [stdout] test tts::template::tests::inline_source_fills_placeholders ... ok
[INFO] [stdout] test tts::text::tests::decodes_entities ... ok
[INFO] [stdout] test tts::text::tests::empty_input ... ok
[INFO] [stdout] test tts::text::tests::plain_text_unchanged ... ok
[INFO] [stdout] test tts::text::tests::collapses_whitespace ... ok
[INFO] [stdout] test tts::ir::tests::stray_closing_bracket_stays_text ... ok
[INFO] [stdout] test tts::text::tests::strips_cloze ... ok
[INFO] [stdout] test tts::text::tests::strips_html_tags ... ok
[INFO] [stdout] test tts::text::tests::combined ... ok
[INFO] [stdout] test tts::provider::edge::tests::binary_audio_body_rejects_mismatched_request_id ... ok
[INFO] [stdout] test tts::provider::edge::tests::sec_ms_gec_matches_current_edge_formula ... ok
[INFO] [stdout] test tts::render::tests::plain_text_preserves_whitespace_verbatim ... ok
[INFO] [stdout] test tts::render::tests::plain_text_reading_replaces_surface ... ok
[INFO] [stdout] test tts::voices::app::state::tests::constructs_app_from_explicit_dependencies_without_side_effects ... ok
[INFO] [stdout] test tts::render::tests::ssml_real_sample_exact_output ... ok
[INFO] [stdout] test tts::spec::tests::resolves_defaults ... ok
[INFO] [stdout] test tts::text::tests::strips_sound_tags ... ok
[INFO] [stdout] test tts::voices::app::state::tests::clamps_overlay_selection_when_rows_change ... ok
[INFO] [stdout] test tts::voices::app::state::tests::overlay_actions_update_filters_and_close_semantics ... ok
[INFO] [stdout] test tts::voices::app::state::tests::preview_queue_dispatches_after_stale_and_current_results ... ok
[INFO] [stdout] test tts::voices::app::state::tests::filter_application_updates_results_and_selection ... ok
[INFO] [stdout] test tts::voices::app::state::tests::keeps_empty_overlay_selection_unselected ... ok
[INFO] [stdout] test tts::voices::app::state::tests::stale_main_selection_clamps_during_update_not_draw ... ok
[INFO] [stdout] test tts::voices::catalog::tests::providerid_roundtrip ... ok
[INFO] [stdout] test tts::voices::sample::tests::chinese_variants_share_sample ... ok
[INFO] [stdout] test tts::voices::sample::tests::known_languages_have_native_samples ... ok
[INFO] [stdout] test tts::voices::yaml::tests::azure_scaffold_has_region_placeholder_when_missing ... ok
[INFO] [stdout] test tts::voices::sample::tests::unknown_language_falls_back_to_english ... ok
[INFO] [stdout] test tts::voices::yaml::tests::amazon_scaffold_includes_model_when_set ... ok
[INFO] [stdout] test tui::line_input::tests::basic_typing ... ok
[INFO] [stdout] test tts::voices::yaml::tests::openai_scaffold_has_no_region ... ok
[INFO] [stdout] test tts::voices::yaml::tests::azure_scaffold_uses_override_region ... ok
[INFO] [stdout] test tui::line_input::tests::delete_prev_char_unicode ... ok
[INFO] [stdout] test tui::line_input::tests::delete_next_char ... ok
[INFO] [stdout] test tui::line_input::tests::insert_str_at_cursor ... ok
[INFO] [stdout] test tui::line_input::tests::delete_prev_word ... ok
[INFO] [stdout] test tui::line_input::tests::visual_cursor_wide_chars ... ok
[INFO] [stdout] test update::tests::test_is_homebrew_cellar ... ok
[INFO] [stdout] test update::tests::test_is_homebrew_prefix ... ok
[INFO] [stdout] test update::tests::test_is_not_homebrew_home ... ok
[INFO] [stdout] test update::tests::test_is_not_homebrew_local_bin ... ok
[INFO] [stdout] test update::tests::test_platform_suffix_current ... ok
[INFO] [stdout] test tts::voices::app::state::tests::draw_does_not_mutate_app_state ... ok
[INFO] [stdout] test workspace::context::tests::no_workspace_when_empty ... ok
[INFO] [stdout] test tui::line_input::tests::paste ... ok
[INFO] [stdout] test tui::line_input::tests::paste_normalizes_newlines ... ok
[INFO] [stdout] test workspace::context::tests::workspace_with_manifest ... ok
[INFO] [stdout] test tts::voices::app::state::tests::player_cleanup_reaps_and_stops_children ... ok
[INFO] [stdout] test audio::player::tests::play_then_shutdown_reaps_child ... ok
[INFO] [stdout] test workspace::discovery::tests::falls_back_to_filename_when_no_title ... ok
[INFO] [stdout] test workspace::manifest::tests::default_manifest ... ok
[INFO] [stdout] test workspace::discovery::tests::empty_dir_returns_empty ... ok
[INFO] [stdout] test workspace::context::tests::workspace_with_prompts_dir_only ... ok
[INFO] [stdout] test workspace::discovery::tests::skips_malformed_frontmatter ... ok
[INFO] [stdout] test workspace::manifest::tests::round_trip ... ok
[INFO] [stdout] test workspace::discovery::tests::discovers_md_files_with_frontmatter ... ok
[INFO] [stdout] test workspace::discovery::tests::skips_process_prompts_without_deck_note_type ... ok
[INFO] [stdout] test tts::voices::catalog::tests::text_search_matches_voice_id_and_name ... ok
[INFO] [stdout] test audio::player::tests::different_card_replaces_active_child ... ok
[INFO] [stdout] test tts::voices::catalog::tests::filter_by_provider_narrows_to_azure ... ok
[INFO] [stdout] test tts::voices::catalog::tests::snapshot_parses_and_has_all_providers ... ok
[INFO] [stdout] test tts::voices::catalog::tests::build_facets_collects_sorted_values ... ok
[INFO] [stdout] test tts::voices::catalog::tests::filter_by_language_narrows_to_ja ... ok
[INFO] [stdout] test audio::player::tests::same_card_replay_toggles_stop ... ok
[INFO] [stdout] test batch::engine::tests::retry_succeeds_on_second_attempt ... ok
[INFO] [stdout] test llm::retry::tests::exhausts_retries ... ok
[INFO] [stdout] test llm::retry::tests::retries_until_success ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 426 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.09s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/anki_llm-df0507013ff1921f)
[INFO] [stdout] 
[INFO] [stderr]      Running tests/anki_integration.rs (/opt/rustwide/target/debug/deps/anki_integration-5b610e5eace6c811)
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]      Running tests/cli_help_snapshot.rs (/opt/rustwide/target/debug/deps/cli_help_snapshot-9da13b4a67f169f4)
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 3 tests
[INFO] [stdout] test root_help_matches_snapshot ... ok
[INFO] [stdout] test top_level_command_manifest_matches_snapshot ... ok
[INFO] [stdout] test top_level_subcommand_help_matches_snapshots ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/cli_test.rs (/opt/rustwide/target/debug/deps/cli_test-675095b56e4ffc19)
[INFO] [stdout] 
[INFO] [stdout] running 12 tests
[INFO] [stdout] test process_deck_parses_without_output_flags ... ok
[INFO] [stdout] test process_deck_accepts_note_type ... ok
[INFO] [stdout] test config_list_empty_when_no_file ... ok
[INFO] [stdout] test query_docs_prints_documentation ... ok
[INFO] [stdout] test prints_version ... ok
[INFO] [stdout] test prints_help_with_all_subcommands ... ok
[INFO] [stdout] test process_file_dry_run_shows_sample_prompt ... ok
[INFO] [stdout] test config_path_prints_path ... ok
[INFO] [stdout] test config_set_and_get_round_trip ... ok
[INFO] [stdout] test process_file_rejects_missing_id ... ok
[INFO] [stdout] test query_invalid_json_fails ... ok
[INFO] [stdout] test process_file_rejects_prompt_without_frontmatter ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.49s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests anki_llm
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "d925b52445db0a4c1ed95db079b1912d790b330417ecbdc296e44d30b4c4161a", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "d925b52445db0a4c1ed95db079b1912d790b330417ecbdc296e44d30b4c4161a", kill_on_drop: false }`
[INFO] [stdout] d925b52445db0a4c1ed95db079b1912d790b330417ecbdc296e44d30b4c4161a
